#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

//全局变量的定义
int HIGH=20 ; //游戏界面高度
int WIDTH=30;  // 游戏界面宽度
int V=1 ; //小球的速度
int RIDUS=5 ; //挡板的半径

int ball_x, ball_y;  //小球的坐标
int ball_vx, ball_vy;  //小球的速度
int position_x, position_y;  //挡板的中心位置
int left, right;  //挡板的左右位置
int ball_number;  //反弹小球的次数
int block_x, block_y;  //砖块的坐标
int score;  //消除砖块的个数

void gotoxy(int x, int y) //将光标调整到(x,y)的位置  代替清屏函数
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}



void HideCursor()//隐藏光标函数
{
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}




void startup()//数据的初始化
{
	//初始化小球
	ball_x = 1; //高度
	ball_y = WIDTH / 2; //宽度
	ball_vx = V;  //小球的纵向速度
	ball_vy = V;  //小球的横向速度

	//初始化挡板
	position_x = HIGH / 2;
	position_y = WIDTH / 2;  //挡板的中心位置
	left = position_y - RIDUS;//挡板的左位置
	right = position_y + RIDUS;  //挡板的右位置

	//初始化砖块
	block_x = 0; //高度
	block_y = WIDTH / 2;  //宽度
	score = 0;

}



void show()//显示画面
{
	gotoxy(0, 0);	//system("cls"); 

	int i, j;
	for (i = 0; i < HIGH + 1; i++)
	{
		for (j = 0; j < WIDTH; j++)
		{
			if (i == ball_x && j == ball_y)
			{
				printf("0");
			}
			else if (i == block_x && j == block_y)
			{
				printf("B");
			}
			else if (i == HIGH)
			{
				printf("-");
			}
			else if (j == WIDTH - 1)
			{
				printf("|");
			}
			else if (i == HIGH - 1 && j >= left && j <= right)
			{
				printf("*");
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
	}
	printf("反弹次数：%d\n", ball_number);
	printf("消除砖块的个数：%d\n", score);
}




void updateWitoutIput()
{
	if (ball_x == HIGH - 2)
	{
		if (ball_y >= left && ball_y <= right)
		{
			ball_number++;
		}
		else
		{
			printf("游戏失败！\n");
			exit(0);
		}
	}
	if (ball_x == block_x && ball_y == block_y)
	{
		score++;
		block_y = rand() % WIDTH;
	}

	ball_x = ball_x + ball_vx;
	ball_y = ball_y + ball_vy;
	if (ball_x >= HIGH - 2 || ball_x <= 0)
		ball_vx = -ball_vx;
	if (ball_y >= WIDTH -2 || ball_y <= 0)
		ball_vy = -ball_vy;

	Sleep(100);	//睡眠时间
}


void updateWithInput()//与用户输入有关的更新
{
	char input;
	if (_kbhit())
	{
		input = _getch();
		if (input == 'a')
			position_y--;
		if (input == 'd')
			position_y++;
		left = position_y - RIDUS;
		right = position_y + RIDUS;
		if (position_y - 5 < 1)// 防止挡板出界
			position_y ++;
		if (position_y + 8 > WIDTH)
			position_y --;
	}
}





int main()
{
	startup();//初始化
	HideCursor();
	while (1)
	{
		show();//显示画面  
		updateWitoutIput();//与用户输入无关的更新
		updateWithInput(); //与用户输入有关的更新
	}
	return 0;
}